#include "Res.h"

char currentLoginRiderName[128] = {0};

// 工作线程，接受服务器返回来的消息
void *work(void *pArg)
{
    // 把套接字从地址里面取出来
    int sID = *(int *)pArg;
    printf("开始接单\n");
    // 用户连接后会创建当前线程，并且会把用户的套接字id通过参数传入进来
    // 这里是把套接字从地址里面取出来
    MSG msg;
    struct sockaddr_in clientAddr;
    socklen_t len = sizeof(clientAddr);
    // 接收消息
    int ret = 0;

    if ((ret = recv(sID, &msg, sizeof(MSG), 0)) > 0)
    {
        char s[10];
        ORDER_INFOR *oRD = (ORDER_INFOR *)msg.buf;
        printf("您有一条订单信息，信息为：\n");
        // orderID, clientName, storeName, dishName, amount, totalPrice, orderState
        printf("订单号 用户名 商家名 餐品名 餐品数量 餐品价格 订单状态 用户电话 用户地址:\n");
        printf("%d  %s  %s  %s  %d  %f  %s  %s  %s\n", oRD->orderID, oRD->clientName, oRD->storeName, oRD->dishName, oRD->amount, oRD->totalPrice, oRD->orderState, oRD->clientPhone, oRD->clientAddress);
        printf("是否确定接单(n/y)：");
        scanf("%s", s);
        if (0 == strcmp(s, "y"))
        {
            MSG msg;
            msg.identity = rider;
            msg.type = receiveOrder;
            sprintf(msg.buf, "%d", oRD->orderID);
            int ret = send(sID, &msg, sizeof(msg), 0);
            if (ret == -1)
            {
                printf("发送数据出错了\n");
            }
        }
    }
    if (ret <= 0)
    {
        printf("接单成功\n");
    }
}

void orderReceiving(int sID)
{
    pthread_t pt;
    pthread_create(&pt, NULL, work, &sID);
    pthread_join(pt, NULL);
}

void Delivery_Completed(int sID)
{
    MSG msg;
    int orderID;
    msg.identity = rider;
    msg.type = DeliveryCompleted;
    printf("请输入你完成的订单号：");
    scanf("%d", &orderID);
    sprintf(msg.buf, "%d", orderID);

    // 把消息发送给服务器
    int ret = send(sID, &msg, sizeof(msg), 0);
    if (ret == -1)
    {
        printf("发送数据出错了\n");
        return;
    }
}

void GroupChat(int sID)
{
}

void riderPage(int sID)
{
    int selectFunction = 0;
    while (1)
    {
        printf("1.接单 2.运送完成 3.退出\n");
        printf("请选择你想操作的功能：");
        scanf("%d", &selectFunction);
        switch (selectFunction)
        {
        case 1:
            system("clear");
            orderReceiving(sID);
            break;
        case 2:
            system("clear");
            Delivery_Completed(sID);
            break;
        case 3:
            return;

        default:
            printf("选择错误请从从新选择\n");
            break;
        }
    }
}

int userLogin(int sID)
{
    RGU rgu; // 登录可以重用注册的结构体
    printf("请输入用户名和密码\n");
    scanf("%s%s", rgu.name, rgu.pwd);

    MSG msg;
    msg.identity = rider;
    msg.type = Login;
    memcpy(msg.buf, &rgu, sizeof(rgu)); // 把注册结构体拷贝到消息结构体的仓库中

    // 把消息发送给服务器
    int ret = send(sID, &msg, sizeof(msg), 0);
    if (ret == -1)
    {
        printf("发送数据出错了\n");
        return -1;
    }

    // 接受服务器的回复
    struct sockaddr_in serverAddr;
    socklen_t len = sizeof(serverAddr);
    // clientAddr是对方的地址,len地址的长度
    ret = recv(sID, &msg, sizeof(msg), 0);
    if (msg.type == ok)
    {
        printf("骑手登录成功\n");
        sleep(1);
        strcpy(currentLoginRiderName, rgu.name); // 把用户名保存到全局变量中，其他地方都可以使用
        system("clear");
        riderPage(sID);
        return 1;
    }
    else
    {
        printf("还没有注册或者用户名密码错误\n");
        return -1;
    }
}

int registerUser(int sID)
{
    RGU rgu;
    while (getchar() != '\n')
        ;
    printf("请输入用户名:");
    fgets(rgu.name, sizeof(rgu.name), stdin);
    rgu.name[strcspn(rgu.name, "\n")] = 0; // 去除尾部换行符

    printf("请输入密码:");
    fgets(rgu.pwd, sizeof(rgu.pwd), stdin);
    rgu.pwd[strcspn(rgu.pwd, "\n")] = 0;

    printf("请输入你的电话号码:");
    fgets(rgu.phone, sizeof(rgu.phone), stdin);
    rgu.phone[strcspn(rgu.phone, "\n")] = 0;

    MSG msg;
    msg.identity = rider;
    msg.type = Register;
    memcpy(msg.buf, &rgu, sizeof(rgu)); // 把注册结构体拷贝到消息结构体的仓库中

    // 把消息发送给服务器
    int ret = send(sID, &msg, sizeof(msg), 0);
    if (ret == -1)
    {
        printf("发送数据出错了\n");
        return -1;
    }
}

int main(int count, char *arg[])
{
    struct sockaddr_in sin;
    sin.sin_family = AF_INET;   // IPV4的网络地址版本
    sin.sin_port = htons(9000); // 把9000号端口转为网络字节序并赋值给端口参数

    u_int32_t ip = 0;
    // 把字符串ip地址转为网络字节序ip
    inet_pton(AF_INET, "192.168.249.129", &ip);
    sin.sin_addr.s_addr = ip;

    // 创建一个tcp套接字，参数1指定地址族，参数2指定协议，SOCK_STREAM代表是TCP，SOCK_DGRAM代表UDP
    int sID = socket(AF_INET, SOCK_STREAM, 0);

    while (1)
    {
        int is_connect = connect(sID, (struct sockaddr *)&sin, sizeof(struct sockaddr_in));
        if (is_connect == 0)
        {
            MSG msg;
            msg.identity = client;
            msg.type = -1;
            int ret = send(sID, &msg, sizeof(MSG), 0);
            if (-1 == ret)
            {
                perror("发送失败\n");
                continue;
            }
            break;
        }
        else
        {
            perror("连接服务器中...");
            sleep(1);
        }
    }

    char buf[128];
    while (1)
    {
        printf("请选择你要的操作：1.登录 2.注册 3.退出\n");
        scanf("%s", buf);
        if (strcmp(buf, "1") == 0)
        {
            system("clear");
            userLogin(sID);
        }
        else if (strcmp(buf, "2") == 0) // 注册
        {
            system("clear");
            if (-1 == registerUser(sID))
            {
                printf("注册失败了\n");
            }
            system("clear");
        }
        else
            return 0;
    }

    close(sID);

    return 0;
}